package com.demo.persistencia.generica.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.hibernate.criterion.Restrictions;

import com.demo.persistencia.generica.dao.GenericDao;
import com.demo.persistencia.generica.enums.EstadoAsignacionEnum;
import com.demo.persistencia.generica.enums.EstadoRequerimientoEnum;
import com.demo.persistencia.generica.enums.TipoUsuarioEnum;
import com.demo.persistencia.generica.modelo.EstadoRequerimiento;
import com.demo.persistencia.generica.modelo.Item;
import com.demo.persistencia.generica.modelo.Requerimiento;
import com.demo.persistencia.generica.modelo.Usuario;
import com.demo.persistencia.generica.util.Busqueda;
import com.demo.persistencia.generica.util.HibernateUtil;

@SessionScoped
@ManagedBean(name = "bandejaRequerimientosMB")
public class BandejaRequerimientosMB implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8777543109107736802L;

	private List<Requerimiento> listadoRequerimientos;
	private List<Usuario> listaUsuariosDisponibles;
	private Usuario recursoSeleccionado;
	private Requerimiento requerimientoSeleccionado;
	
	private HibernateUtil hUtil;
	private boolean representanteArea;
	
	public BandejaRequerimientosMB() {
		// TODO Auto-generated constructor stub
		this.hUtil = new HibernateUtil();
		this.hUtil.IniciarContextoSpring();
		this.requerimientoSeleccionado = new Requerimiento();
		this.listadoRequerimientos = new ArrayList<Requerimiento>();
		this.listaUsuariosDisponibles = new ArrayList<Usuario>();
	}

	public String actionBandejaRequerimientos() throws Exception {
		try {
			hUtil.openSession();
	        GenericDao<Requerimiento, Integer> requerimientoDAO = (GenericDao<Requerimiento, Integer>) HibernateUtil.getContextoSpring().getBean("requerimientoDao");
	        Usuario usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
	        Busqueda filtro = Busqueda.forClass(Requerimiento.class);
	        switch (TipoUsuarioEnum.get(usuario.getItemByTipousuarioId().getItemId())) {
			case GERENTE_AREA:
			case JEFE_AREA:
				representanteArea = true;
				filtro.add(Restrictions.eq("usuario.usuarioId", usuario.getUsuarioId()));
				filtro.add(Restrictions.eq("item.itemId", EstadoRequerimientoEnum.SOLICITUD.getCodigo()));
				break;
			case GERENTE_SISTEMAS:
				filtro.add(Restrictions.eq("item.itemId", EstadoRequerimientoEnum.SOLICITUD.getCodigo()));
				break;
			case GERENTE_PROYECTO:
				filtro.add(Restrictions.eq("item.itemId", EstadoRequerimientoEnum.DERIVADO.getCodigo()));
				break;
			case RESPONSABLE_DESARROLLO:
				filtro.add(Restrictions.eq("item.itemId", EstadoRequerimientoEnum.ASIGNADO.getCodigo()));
				break;
			case DESARROLLADOR:
				filtro.add(Restrictions.eq("item.itemId", EstadoRequerimientoEnum.DESARROLLO.getCodigo()));
				break;
			case RESPONSABLE_QA:
				filtro.add(Restrictions.eq("item.itemId", EstadoRequerimientoEnum.ATENCION_QA.getCodigo()));
				break;
			case ANALISTA_QA:
				filtro.add(Restrictions.eq("item.itemId", EstadoRequerimientoEnum.VALIDACION_CALIDAD.getCodigo()));
				break;
			case OPERADOR_PRODUCCION:
				filtro.add(Restrictions.eq("item.itemId", EstadoRequerimientoEnum.DESPLIEGUE.getCodigo()));
				break;
			}
		    this.listadoRequerimientos = requerimientoDAO.buscarDinamico(filtro);
		    for (int i = 0; i < listadoRequerimientos.size(); i++) {
				if (this.listadoRequerimientos.get(i).getItem() != null) {
					this.listadoRequerimientos.get(i).getItem().getNombre();
				}
			}
		
		} finally {
	    	hUtil.closeSession();
	    }
		return "BANDEJA_REQUERIMIENTOS";
	}
	
	public void actionListenerDerivarRequerimiento(ActionEvent event) throws Exception {
		Long idRequerimiento = Long.parseLong(event.getComponent().getAttributes().get("idRequerimiento").toString());
		Usuario usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
		this.hUtil.openSession();
		GenericDao<Requerimiento, Integer> requerimientoDAO = (GenericDao<Requerimiento, Integer>) HibernateUtil.getContextoSpring().getBean("requerimientoDao");
		Requerimiento requerimiento = requerimientoDAO.buscarById(Requerimiento.class, idRequerimiento);
		requerimiento.setItem(new Item());
		requerimiento.getItem().setItemId(EstadoRequerimientoEnum.DERIVADO.getCodigo());
		EstadoRequerimiento estadoRequerimiento = new EstadoRequerimiento();
		estadoRequerimiento.setItem(new Item());
		estadoRequerimiento.setFechaModificacion(new Date());
		estadoRequerimiento.setRequerimiento(requerimiento);
		estadoRequerimiento.setUsuario(usuario);
		estadoRequerimiento.getItem().setItemId(EstadoRequerimientoEnum.DERIVADO.getCodigo());
		GenericDao<EstadoRequerimiento, Integer> estadoRequerimientoDAO = (GenericDao<EstadoRequerimiento, Integer>) HibernateUtil.getContextoSpring().getBean("estadoRequerimientoDAO");
        estadoRequerimientoDAO.insertar(estadoRequerimiento);
        this.hUtil.closeSession();
	}
	
	public void actionListenerAsignarRequerimiento(ActionEvent event) throws Exception {
		Long idRequerimiento = Long.parseLong(event.getComponent().getAttributes().get("idRequerimiento").toString());
		Usuario usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
		this.hUtil.openSession();
		GenericDao<Usuario, Integer> estadoRequerimientoDAO = (GenericDao<Usuario, Integer>) HibernateUtil.getContextoSpring().getBean("usuarioDao");
		Busqueda filtro = Busqueda.forClass(Usuario.class);
		filtro.add(Restrictions.sqlRestriction("usuario_id not in (select usuario_id from estado_requerimiento where estado_id =" + EstadoAsignacionEnum.ASIGNADO.getCodigo() + ")"));
		filtro.add(Restrictions.in("itemByTipousuarioId.itemId", new Long[]{
				TipoUsuarioEnum.RESPONSABLE_DESARROLLO.getCodigo()
		}));
		this.listaUsuariosDisponibles = estadoRequerimientoDAO.buscarDinamico(filtro);
		GenericDao<Requerimiento, Integer> requerimientoDAO = (GenericDao<Requerimiento, Integer>) HibernateUtil.getContextoSpring().getBean("requerimientoDao");
		this.requerimientoSeleccionado = requerimientoDAO.buscarById(Requerimiento.class, idRequerimiento);
		this.requerimientoSeleccionado.getItem().getItemId();
		this.requerimientoSeleccionado.getItem().getNombre();
		this.requerimientoSeleccionado.getUsuario().getNombre();
		this.requerimientoSeleccionado.getUsuario().getApellidoPaterno();
		this.requerimientoSeleccionado.getUsuario().getItemByAreaId().getItemId();
		this.requerimientoSeleccionado.getUsuario().getItemByAreaId().getNombre();
		this.hUtil.closeSession();
	}
	
	public void actionListenerAsignarRequerimientoExec(ActionEvent event) throws Exception {
		
	}
	
	public List<Requerimiento> getListadoRequerimientos() {
		return listadoRequerimientos;
	}

	public void setListadoRequerimientos(List<Requerimiento> listadoRequerimientos) {
		this.listadoRequerimientos = listadoRequerimientos;
	}

	public boolean isRepresentanteArea() {
		return representanteArea;
	}

	public void setRepresentanteArea(boolean representanteArea) {
		this.representanteArea = representanteArea;
	}

	public Usuario getRecursoSeleccionado() {
		return recursoSeleccionado;
	}

	public void setRecursoSeleccionado(Usuario recursoSeleccionado) {
		this.recursoSeleccionado = recursoSeleccionado;
	}

	public List<Usuario> getListaUsuariosDisponibles() {
		return listaUsuariosDisponibles;
	}

	public void setListaUsuariosDisponibles(List<Usuario> listaUsuariosDisponibles) {
		this.listaUsuariosDisponibles = listaUsuariosDisponibles;
	}

	public Requerimiento getRequerimientoSeleccionado() {
		return requerimientoSeleccionado;
	}

	public void setRequerimientoSeleccionado(Requerimiento requerimientoSeleccionado) {
		this.requerimientoSeleccionado = requerimientoSeleccionado;
	}
	
}
